home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / wb / closewb_v17.lha / CloseWB_1.7 / Sources.lha / Sources / CloseWB.c
Encoding:
C/C++ Source or Header  |  1995-02-07  |  19.8 KB  |  643 lines

  1. ;/*
  2.  
  3. ;CatComp CloseWB.cd CTFILE CloseWB_xxx.ct
  4. ;CatComp CloseWB.cd CloseWB_xxx.ct CATALOG //Catalogs/xxx/CloseWB.catalog
  5.  
  6. CatComp Catalogs/CloseWB.cd CFILE CloseWB_strings.h OBJFILE CloseWB_strings.o
  7. sc PARM=REGISTERS RESOPT DATA=NEAR NMINC UCHAR CONSTLIB STREQ ANSI NOSTKCHK OPTIMIZE OPTSIZE IGNORE=73 CloseWB.c
  8. slink FROM LIB:c.o,CloseWB.o,CloseWB_strings.o TO /CloseWB LIBRARY LIB:sc.lib,LIB:Amiga.lib SC SD NOICONS STRIPDEBUG
  9. delete >NIL: CloseWB.o CloseWB_strings.(h|o)
  10. quit
  11.  
  12.  CloseWB.c - Simple hot key commodity compiled with SASC 6.51
  13.  
  14.  This piece of code is Copyright © 1995 by Stefano Reksten of 3AM
  15.  - The Three Amigos!!!
  16.  
  17. */
  18.  
  19. #include <dos/dos.h>
  20. #include <exec/memory.h>
  21. #include <exec/libraries.h>
  22. #include <exec/execbase.h>
  23. #include <devices/input.h>
  24. #include <devices/inputevent.h>
  25. #include <graphics/gfxbase.h>
  26. #include <intuition/intuition.h>
  27. #include <intuition/intuitionbase.h>
  28. #include <intuition/screens.h>
  29. #include <libraries/commodities.h>
  30. #include <libraries/gadtools.h>
  31. #include <libraries/locale.h>
  32. #include <workbench/startup.h>
  33. #include <string.h>
  34.  
  35. #include <proto/exec.h>
  36. #include <proto/intuition.h>
  37. #include <proto/commodities.h>
  38. #include <proto/dos.h>
  39. #include <proto/icon.h>
  40. #include <proto/gadtools.h>
  41. #include <proto/graphics.h>
  42. #include <proto/locale.h>
  43. #include <clib/alib_protos.h>
  44. #include <clib/alib_stdio_protos.h>
  45.  
  46. #define EVT_HOTKEY 1L
  47. #define EVT_POPKEY 2L
  48.  
  49. #define CATCOMP_NUMBERS
  50. #define CATCOMP_BLOCK
  51. #include "CloseWB_strings.h"
  52.  
  53. char *ver = "$VER: CloseWB 1.7 "__AMIGADATE__;
  54.  
  55. extern STRPTR __asm GetString(register __a0 struct LocaleInfo *li,
  56.                        register __d0 LONG stringNum);
  57. struct LocaleInfo li;
  58. char *str_windows, *str_shells, *str_flush, *str_hide, *str_quit, *str_wbench,
  59.      *key_windows, *key_shells, *key_flush, *key_hide, *key_quit;
  60.  
  61. void ProcessMsg(void);
  62. struct Screen *FindWB(void);
  63. void CloseWindowsOrShells(void);
  64. void SendWindowcloseTo(struct Window *);
  65. void SendCtrlBackslashTo(struct Window *);
  66. BOOL ProcessCommodityMsg(void);
  67. BOOL ProcessWindowMsg(void);
  68. BOOL OpenWBWindow(void);
  69. void CloseWBWindow(void);
  70. void FlushAll(void);
  71.  
  72. struct EasyStruct warn_rq = { sizeof(struct EasyStruct),
  73.                               NULL,
  74.                               "CloseWB Request",
  75.                               "Please close all windows\nor shells before.",
  76.                               "OK|CANCEL" };
  77.  
  78. extern struct ExecBase *SysBase;
  79. struct IntuitionBase *IntuitionBase;
  80. struct GfxBase *GfxBase;
  81. struct Library *CxBase, *GadToolsBase, *IconBase, *LocaleBase;
  82. struct Window *wbwindow;
  83. struct MsgPort *broker_mp;
  84. CxObj *broker;
  85.  
  86. struct NewBroker newbroker = {
  87.     NB_VERSION,
  88.     "CloseWB",
  89.     "CloseWB 1.7 © 1995 by Stefano Reksten of 3AM",
  90.     "Closes or re-opens Workbench screen",
  91.     NBU_UNIQUE | NBU_NOTIFY,
  92.     COF_SHOW_HIDE, 0, 0, 0 };
  93.  
  94. ULONG cxsigflag;
  95. ULONG close_windows = TRUE, close_shells = TRUE, close_wb = TRUE, flush_all = TRUE;
  96.  
  97. #define CWND_ID 1
  98. #define CSHL_ID 2
  99. #define CWBS_ID 3
  100. #define FLSH_ID 4
  101. #define HIDE_ID 5
  102. #define QUIT_ID 6
  103.  
  104.  
  105. struct Gadget *glist = NULL;
  106.  
  107.  
  108. BOOL AttachFilter( STRPTR onkey, ULONG user_event )
  109. {
  110.     register CxObj *filter, *sender, *translator;
  111.  
  112.     if ( filter = CxFilter( onkey ) )
  113.     {
  114.         AttachCxObj( broker, filter );
  115.  
  116.        if ( sender = CxSender( broker_mp, user_event ) )
  117.        {
  118.            AttachCxObj( filter, sender );
  119.  
  120.            if ( translator = CxTranslate( NULL ) )
  121.            {
  122.                AttachCxObj( filter, translator );
  123.  
  124.                if ( !CxObjError( filter ) )
  125.                    return TRUE;
  126.            }
  127.        }
  128.     }
  129.     return FALSE;
  130. }
  131.  
  132.  
  133. void EmptyMsgPort( struct MsgPort *mp )
  134. {
  135.     struct Message *msg;
  136.  
  137.     while( msg = GetMsg( mp ) )
  138.         ReplyMsg( msg );
  139. }
  140.  
  141.  
  142. void __main( void )
  143. {
  144.     UBYTE hotkey[30], popkey[30];
  145.     BOOL popup;
  146.  
  147.     li.li_Catalog = NULL;
  148.     if ( LocaleBase = OpenLibrary( "locale.library", 38L ) )
  149.     {
  150.         li.li_LocaleBase = LocaleBase;
  151.         li.li_Catalog = OpenCatalogA( NULL, "CloseWB.catalog", NULL );
  152.     
  153.         warn_rq.es_Title = GetString( &li, MSG_CLOSEWBREQUESTTITLE );
  154.         warn_rq.es_TextFormat = GetString( &li, MSG_PLEASECLOSEALL );
  155.         warn_rq.es_GadgetFormat = GetString( &li, MSG_REQUESTGADGETS );
  156.  
  157.         newbroker.nb_Descr = GetString( &li, MSG_NEWBROKER );
  158.  
  159.         str_windows = GetString( &li, MSG_WINDOWS );
  160.         key_windows = GetString( &li, MSG_WINDOWS_KEY );
  161.         str_shells = GetString( &li, MSG_SHELLS );
  162.         key_shells = GetString( &li, MSG_SHELLS_KEY );
  163.         str_flush = GetString( &li, MSG_FLUSH );
  164.         key_flush = GetString( &li, MSG_FLUSH_KEY );
  165.         str_hide = GetString( &li, MSG_HIDE );
  166.         key_hide = GetString( &li, MSG_HIDE_KEY );
  167.         str_quit = GetString( &li, MSG_QUIT );
  168.         key_quit = GetString( &li, MSG_QUIT_KEY );
  169.         str_wbench = "_Workbench";
  170.     }
  171.     else
  172.     {
  173.         str_windows = "Windows";
  174.         key_windows = "I";
  175.         str_shells = "Shells";
  176.         key_shells = "S";
  177.         str_flush = "Flush";
  178.         key_flush = "F";
  179.         str_hide = "Hide";
  180.         key_hide = "H";
  181.         str_quit = "Quit";
  182.         key_quit = "Q";
  183.         str_wbench = "Workbench";
  184.     }
  185.  
  186.     if (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37L))
  187.     {
  188.         if (CxBase = OpenLibrary("commodities.library", 37L))
  189.         {
  190.             if (broker_mp = CreateMsgPort())
  191.             {
  192.                 newbroker.nb_Port = broker_mp;
  193.                 cxsigflag = 1L << broker_mp->mp_SigBit;
  194.  
  195.                 hotkey[0] = popkey[0] = NULL;
  196.  
  197.                 if (IconBase = OpenLibrary("icon.library",37))
  198.                 {
  199.                     char **ttypes;
  200.                     struct DiskObject *ob;
  201.  
  202.                     if ( ob = GetDiskObject( "CloseWB" ) )
  203.                     {
  204.                         ttypes = ob->do_ToolTypes;
  205.  
  206.                         newbroker.nb_Pri = (BYTE)ArgInt(ttypes, "CX_PRIORITY", 0);
  207.  
  208.                         close_windows = MatchToolValue( FindToolType(ttypes, "CLOSEWINDOWS"), "TRUE" );
  209.                         close_shells = MatchToolValue( FindToolType(ttypes, "CLOSESHELLS"), "TRUE");
  210.                         close_wb = MatchToolValue( FindToolType(ttypes, "CLOSEWORKBENCH"), "TRUE");
  211.                         flush_all = MatchToolValue( FindToolType(ttypes, "FLUSH"), "TRUE");
  212.  
  213.                         popup = MatchToolValue(FindToolType(ttypes, "CX_POPUP"), "YES");
  214.  
  215.                         strcpy( hotkey, FindToolType(ttypes, "CX_HOTKEY") );
  216.                         strcpy( popkey, FindToolType(ttypes, "CX_POPKEY") );
  217.  
  218.                         FreeDiskObject( ob );
  219.                     }
  220.                     CloseLibrary(IconBase);
  221.                 }
  222.  
  223.                 if (!(hotkey[0]))
  224.                     strcpy( hotkey, "lalt w" );
  225.                 if (!(popkey[0]))
  226.                     strcpy( popkey, "ctrl lalt w" );
  227.  
  228.                 if (broker = CxBroker(&newbroker, NULL))
  229.                 {
  230.                     if ( AttachFilter( hotkey, EVT_HOTKEY ) &&
  231.                          AttachFilter( popkey, EVT_POPKEY ) )
  232.                     {
  233.                         ActivateCxObj(broker, 1L);
  234.                         if (popup)
  235.                             OpenWBWindow();
  236.                         ProcessMsg();
  237.                     }
  238.                     DeleteCxObjAll(broker);
  239.                 }
  240.                 EmptyMsgPort( broker_mp );
  241.                 DeletePort( broker_mp );
  242.             }
  243.             CloseLibrary( CxBase );
  244.         }
  245.         CloseWBWindow();
  246.         CloseLibrary( (struct Library *)IntuitionBase );
  247.     }
  248.  
  249.     if ( LocaleBase )
  250.     {
  251.         if ( li.li_Catalog )
  252.              CloseCatalog( li.li_Catalog );
  253.         CloseLibrary( LocaleBase );
  254.     }
  255. }
  256.  
  257.  
  258. void ProcessMsg(void)
  259. {
  260.     BOOL stay = TRUE;
  261.     ULONG sigrcvd, waitmask;
  262.  
  263.     while(stay)
  264.     {
  265.         waitmask = cxsigflag | SIGBREAKF_CTRL_C;
  266.         if (wbwindow) waitmask |= 1L<<wbwindow->UserPort->mp_SigBit;
  267.         sigrcvd = Wait(waitmask);
  268.  
  269.         if (sigrcvd & SIGBREAKF_CTRL_C)
  270.             stay = FALSE;
  271.         else
  272.         if (sigrcvd & cxsigflag)
  273.             stay = ProcessCommodityMsg();
  274.         else
  275.             stay = ProcessWindowMsg();
  276.     }
  277. }
  278.  
  279.  
  280. struct Screen *FindWB(void)
  281. {
  282.     register struct Screen *scr = IntuitionBase->FirstScreen;
  283.  
  284.     while(scr && (!(scr->DefaultTitle) || strcmp(scr->DefaultTitle, "Workbench Screen")))
  285.         scr = scr->NextScreen;
  286.     return(scr);
  287. }
  288.  
  289.  
  290. void CloseWindowsOrShells()
  291. {
  292.     register struct Window *window, *next;
  293.  
  294.     if (close_windows && wbwindow)
  295.         CloseWBWindow();
  296.     
  297.     window = (FindWB())->FirstWindow;
  298.  
  299.     while(window)
  300.     {
  301.         next = window->NextWindow;
  302.         if (window->UserPort && close_windows)
  303.         {
  304.             if (window->Title && strcmp(window->Title, "Workbench"))
  305.                 SendWindowcloseTo(window);
  306.         }
  307.         else if (close_shells)
  308.         {
  309.             ActivateWindow(window);
  310.             SendCtrlBackslashTo(window);
  311.             Delay( 5 );
  312.         }
  313.         window = next;
  314.     }
  315. }
  316.  
  317.  
  318. void SendWindowcloseTo(struct Window *window)
  319. {
  320.     register struct IntuiMessage *imsg;
  321.     
  322.     if (imsg = (struct IntuiMessage *)AllocVec(sizeof(struct IntuiMessage), MEMF_ANY|MEMF_CLEAR))
  323.     {
  324.         imsg->ExecMessage.mn_ReplyPort = broker_mp;
  325.         imsg->ExecMessage.mn_Length = sizeof(struct IntuiMessage);
  326.         imsg->Class = IDCMP_CLOSEWINDOW;
  327.         imsg->ExecMessage.mn_Node.ln_Type = NT_MESSAGE;
  328.         imsg->IDCMPWindow = window;
  329.         PutMsg(window->UserPort, (struct Message *)imsg);
  330.         WaitPort(broker_mp);
  331.         GetMsg(broker_mp);
  332.         FreeVec(imsg);
  333.     }
  334. }
  335.  
  336.  
  337. void SendCtrlBackslashTo(struct Window *window)
  338. {
  339.     register struct InputEvent *fakeev;
  340.     register struct IOStdReq *ioreq;
  341.  
  342.     if (fakeev = AllocVec(sizeof(struct InputEvent),MEMF_PUBLIC|MEMF_CLEAR))
  343.     {
  344.         if (ioreq = CreateIORequest(broker_mp,sizeof(struct IOStdReq)))
  345.         {
  346.             if ( !OpenDevice("input.device",NULL,(struct IORequest *)ioreq,NULL))
  347.             {
  348.                 fakeev->ie_Class = IECLASS_RAWKEY;
  349.                 fakeev->ie_Code = 0x0D;
  350.                 fakeev->ie_Qualifier = IEQUALIFIER_CONTROL;
  351.  
  352.                 ioreq->io_Data = (APTR)fakeev;
  353.                 ioreq->io_Length = sizeof(struct InputEvent);
  354.                 ioreq->io_Command = IND_WRITEEVENT;
  355.  
  356.                 DoIO((struct IORequest *)ioreq);
  357.                 CloseDevice((struct IORequest *)ioreq);
  358.             }
  359.             DeleteIORequest(ioreq);
  360.         }
  361.         FreeVec(fakeev);
  362.     }
  363. }
  364.  
  365. struct IntuiText it = { 0, 0, 0, 0, 0, NULL, NULL, NULL };
  366. struct NewGadget ng = { 0, 0, 50, 0, NULL, NULL, 0, 0, NULL, NULL };
  367. struct VisualInfo *vi;
  368. struct Gadget *gad;
  369. UWORD textw, wleft = (UWORD)~0, wtop = (UWORD)~0;
  370. struct Gadget *windows_gad, *shells_gad, *workbench_gad, *flush_gad;
  371.  
  372. /* Some other routines to make it shorter */
  373.  
  374. UWORD MaxBetween( STRPTR text, UWORD prev )
  375. {
  376. register UWORD ilength, max;
  377.  
  378. it.IText = text;
  379. ilength = IntuiTextLength( &it );
  380. max = ( ilength > prev ? ilength : prev );
  381. return max;
  382. }
  383.  
  384. struct Gadget *AddCheckboxGadget( STRPTR name, ULONG ID, BOOL selected )
  385. {
  386. ng.ng_TopEdge += ng.ng_Height + 1;
  387. ng.ng_GadgetText = name;
  388. ng.ng_GadgetID = ID;
  389. gad = CreateGadget(CHECKBOX_KIND,gad,&ng,GTCB_Checked,selected,GTCB_Scaled,TRUE,GT_Underscore,'_',TAG_END);
  390. textw = MaxBetween( name, textw );
  391. return gad;
  392. }
  393.  
  394.  
  395. BOOL OpenWBWindow(void)
  396. {
  397.     struct Screen *wbs = LockPubScreen(NULL);
  398.     register UWORD fonth, wheight, wwidth;
  399.  
  400.     if (!wbwindow)
  401.     {
  402.         fonth = wbs->Font->ta_YSize;
  403.         if ( fonth < 12 )
  404.             fonth = 12;
  405.         it.ITextFont = wbs->Font;
  406.         textw = 0;
  407.         wheight = wbs->BarHeight + fonth * 5 + 5 + wbs->WBorBottom;
  408.         if (GadToolsBase = OpenLibrary("gadtools.library",37L))
  409.         {
  410.             if (vi = GetVisualInfo(wbs,NULL))
  411.             {
  412.                 ng.ng_VisualInfo = vi;
  413.                 ng.ng_LeftEdge = wbs->WBorLeft + 4;
  414.                 ng.ng_TopEdge = wbs->BarHeight;
  415.                 ng.ng_TextAttr = wbs->Font;
  416.  
  417.                 gad = CreateContext(&glist);
  418.                 if (gad)
  419.                 {
  420.                     ng.ng_TopEdge -= fonth - 2;
  421.                     ng.ng_Flags = PLACETEXT_RIGHT;
  422.                     ng.ng_Height = fonth - 1;
  423.                     ng.ng_Width = 26;
  424.  
  425.                     windows_gad = AddCheckboxGadget( str_windows, CWND_ID, close_windows );
  426.                     shells_gad = AddCheckboxGadget( str_shells, CSHL_ID, close_shells );
  427.                     workbench_gad = AddCheckboxGadget( str_wbench, CWBS_ID, close_wb );
  428.                     flush_gad = AddCheckboxGadget( str_flush, FLSH_ID, flush_all );
  429.  
  430.                     wwidth = textw + wbs->WBorLeft + wbs->WBorRight + 48;
  431.  
  432.                     textw = MaxBetween( str_hide, MaxBetween( str_quit, 0 ) );
  433.                     if ( ( textw * 2 + wbs->WBorLeft + wbs->WBorRight + 48 ) > wwidth )
  434.                     wwidth = ( textw * 2 + wbs->WBorLeft + wbs->WBorRight + 48 );
  435.                     textw = ( wwidth - wbs->WBorLeft - wbs->WBorRight - 10) >> 1;
  436.  
  437.                     ng.ng_Height = fonth + 2;
  438.                     ng.ng_TopEdge += fonth;
  439.                     ng.ng_Width = textw;
  440.                     ng.ng_Flags = PLACETEXT_IN;
  441.                     ng.ng_GadgetText = str_hide;
  442.                     ng.ng_GadgetID = HIDE_ID;
  443.                     gad = CreateGadget(BUTTON_KIND,gad,&ng,GT_Underscore,'_',TAG_END);
  444.  
  445.                     ng.ng_LeftEdge += ng.ng_Width + 2;
  446.                     ng.ng_GadgetText = str_quit;
  447.                     ng.ng_GadgetID = QUIT_ID;
  448.                     gad = CreateGadget(BUTTON_KIND,gad,&ng,GT_Underscore,'_',TAG_END);
  449.  
  450.                     if ( wtop == ~0 )
  451.                         wtop = (wbs->Height - wheight)>>1;
  452.                     if ( wleft == ~0 )
  453.                         wleft = (wbs->Width - wwidth)>>1;
  454.  
  455.                     if (gad && (wbwindow = OpenWindowTags( NULL,
  456.                         WA_Left, wleft,
  457.                         WA_Top, wtop,
  458.                         WA_Width, wwidth,
  459.                         WA_Height, wheight,
  460.                         WA_Title, "CloseWB",
  461.                         WA_ScreenTitle, "CloseWB 1.7 © 1995 by Stefano Reksten of 3AM",
  462.                         WA_Flags, WFLG_CLOSEGADGET|WFLG_DEPTHGADGET|WFLG_DRAGBAR|WFLG_ACTIVATE|WFLG_RMBTRAP,
  463.                         WA_Gadgets, glist,
  464.                         WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_GADGETDOWN|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW|BUTTONIDCMP,
  465.                         TAG_END )))
  466.                     {
  467.                         ScreenToFront(wbs);
  468.                         UnlockPubScreen(NULL,wbs);
  469.                         return TRUE;
  470.                     }
  471.                 }
  472.                 FreeVisualInfo(vi);
  473.             }
  474.             CloseLibrary(GadToolsBase);
  475.         }
  476.     }
  477.  
  478.     UnlockPubScreen(NULL,wbs);
  479.     return FALSE;
  480. }
  481.  
  482.  
  483. BOOL ProcessCommodityMsg(void)
  484. {
  485.     BOOL returnvalue = TRUE;
  486.     CxMsg *msg;
  487.     ULONG msgid, msgtype;
  488.     BOOL cont;
  489.  
  490.     while(msg = (CxMsg *)GetMsg(broker_mp))
  491.     {
  492.         msgid = CxMsgID(msg);
  493.         msgtype = CxMsgType(msg);
  494.         ReplyMsg((struct Message *)msg);
  495.  
  496.         switch(msgtype)
  497.         {
  498.             case CXM_IEVENT:
  499.                 switch(msgid)
  500.                 {
  501.                     case EVT_HOTKEY:
  502.                         if ((BOOL)FindWB())
  503.                         {
  504.                             if (close_wb && wbwindow)
  505.                                 CloseWBWindow();
  506.  
  507.                             if (close_windows || close_shells)
  508.                                 CloseWindowsOrShells();
  509.                             cont = TRUE;
  510.                             while (cont && close_wb)
  511.                                 {
  512.                                 cont = !CloseWorkBench();
  513.                                 if (cont)
  514.                                     {
  515.                                     DisplayBeep(NULL);
  516.                                     cont = EasyRequestArgs(NULL, &warn_rq, NULL, NULL);
  517.                                     }
  518.                                 }
  519.                             if (flush_all)
  520.                                 FlushAll();
  521.                         }
  522.                         else
  523.                            OpenWorkBench();
  524.                         break;
  525.                     case EVT_POPKEY:
  526.                         OpenWBWindow();
  527.                     default:
  528.                         break;
  529.                 }
  530.                 break;
  531.             case CXM_COMMAND:
  532.                 switch(msgid)
  533.                 {
  534.                     case CXCMD_DISABLE:
  535.                         ActivateCxObj(broker, 0L);
  536.                         break;
  537.                     case CXCMD_ENABLE:
  538.                         ActivateCxObj(broker, 1L);
  539.                         break;
  540.                     case CXCMD_KILL:
  541.                         returnvalue = FALSE;
  542.                         break;
  543.                     case CXCMD_UNIQUE:
  544.                         OpenWBWindow();
  545.                         break;
  546.                     case CXCMD_APPEAR:
  547.                         OpenWBWindow();
  548.                         break;
  549.                     case CXCMD_DISAPPEAR:
  550.                         CloseWBWindow();
  551.                     default:
  552.                         break;
  553.                 }
  554.                 break;
  555.             default:
  556.                 break;
  557.         }
  558.     }
  559.     return returnvalue;
  560. }
  561.  
  562.  
  563. BOOL ProcessWindowMsg(void)
  564. {
  565.     register struct IntuiMessage *msg;
  566.     register BOOL returnvalue = TRUE;
  567.     register ULONG class;
  568.     register UWORD msgID;
  569.  
  570.     while(wbwindow && (msg = GT_GetIMsg(wbwindow->UserPort)))
  571.     {
  572.         class = msg->Class;
  573.         if (class & (BUTTONIDCMP|IDCMP_GADGETDOWN))
  574.             msgID = ((struct Gadget *)msg->IAddress)->GadgetID;
  575.         if (class == IDCMP_VANILLAKEY)
  576.             msgID = msg->Code;
  577.         GT_ReplyIMsg(msg);
  578.  
  579.         switch(class)
  580.         {
  581.             case IDCMP_REFRESHWINDOW:
  582.                 GT_BeginRefresh(wbwindow);
  583.                 GT_EndRefresh(wbwindow,TRUE);
  584.                 break;
  585.             case IDCMP_CLOSEWINDOW:
  586.                 CloseWBWindow();
  587.                 break;
  588.             case BUTTONIDCMP:
  589.             case IDCMP_GADGETDOWN:
  590.                 if ( msgID == CWND_ID ) close_windows ^= TRUE;
  591.                 if ( msgID == CSHL_ID ) close_shells ^= TRUE;
  592.                 if ( msgID == CWBS_ID ) close_wb ^= TRUE;
  593.                 if ( msgID == FLSH_ID ) flush_all ^= TRUE;
  594.                 if ( msgID == HIDE_ID ) CloseWBWindow();
  595.                 if ( msgID == QUIT_ID ) returnvalue = FALSE;
  596.                 break;
  597.             case IDCMP_VANILLAKEY:
  598.                 msgID ^= 32; /* To upper */
  599.                 if ( msgID == *key_windows ) { close_windows ^= TRUE; GT_SetGadgetAttrs( windows_gad, wbwindow, NULL, GTCB_Checked, close_windows, TAG_END ); }
  600.                 if ( msgID == *key_shells )  { close_shells ^= TRUE; GT_SetGadgetAttrs( shells_gad, wbwindow, NULL, GTCB_Checked, close_shells, TAG_END ); }
  601.                 if ( msgID == 'W' )          { close_wb ^= TRUE; GT_SetGadgetAttrs( workbench_gad, wbwindow, NULL, GTCB_Checked, close_wb, TAG_END ); }
  602.                 if ( msgID == *key_flush )   { flush_all ^= TRUE; GT_SetGadgetAttrs( flush_gad, wbwindow, NULL, GTCB_Checked, flush_all, TAG_END ); }
  603.                 if ( msgID == *key_hide )    CloseWBWindow();
  604.                 if ( msgID == *key_quit )    returnvalue = FALSE;
  605.         }
  606.     }
  607.     return returnvalue;
  608. }
  609.  
  610.  
  611. void CloseWBWindow(void)
  612. {
  613.     if(wbwindow)
  614.     {
  615.         wleft = wbwindow->LeftEdge;
  616.         wtop = wbwindow->TopEdge;
  617.         EmptyMsgPort( wbwindow->UserPort );
  618.         CloseWindow(wbwindow);
  619.         FreeGadgets(glist);
  620.         FreeVisualInfo(vi);
  621.         CloseLibrary(GadToolsBase);
  622.         wbwindow = NULL;
  623.     }
  624. }
  625.  
  626.  
  627. void FlushAll(void)
  628. {
  629.     register struct Node *node;
  630.  
  631.     Forbid();
  632.     for(node = SysBase->LibList.lh_Head; node->ln_Succ; node = node->ln_Succ)
  633.         RemLibrary((struct Library *)node);
  634.     for(node = SysBase->DeviceList.lh_Head; node->ln_Succ; node = node->ln_Succ)
  635.         RemDevice((struct Device *)node);
  636.     Permit();
  637.     if (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L))
  638.     {
  639.         for(node = GfxBase->TextFonts.lh_Head; node->ln_Succ; node = node->ln_Succ)
  640.             RemFont((struct TextFont *)node);
  641.     }
  642. }
  643.